package date_202405

//54. 螺旋矩阵
//中等
//相关标签
//相关企业
//提示
//给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
//
//
//
//示例 1：
//
//
//输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
//输出：[1,2,3,6,9,8,7,4,5]
//示例 2：
//
//
//输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
//输出：[1,2,3,4,8,12,11,10,9,5,6,7]
//
//
//提示：
//
//m == matrix.length
//n == matrix[i].length
//1 <= m, n <= 10
//-100 <= matrix[i][j] <= 100

func spiralOrder(matrix [][]int) []int {
	if len(matrix) == 0 || len(matrix[0]) == 0 {
		return []int{}
	}
	spiral := make([]int, 0, len(matrix)*len(matrix[0]))
	iterateMatrix := matrix
	for len(iterateMatrix) > 0 && len(iterateMatrix[0]) > 0 {
		spiral = append(spiral, GetMatrixOuter(iterateMatrix)...)
		if len(iterateMatrix) > 2 && len(iterateMatrix[0]) > 2 {
			iterateMatrix = iterateMatrix[1 : len(iterateMatrix)-1]
			for i := 0; i < len(iterateMatrix); i++ {
				iterateMatrix[i] = iterateMatrix[i][1 : len(iterateMatrix[i])-1]
			}
		} else {
			break
		}

	}
	return spiral
}

func GetMatrixOuter(matrix [][]int) []int {
	if len(matrix) == 0 {
		return []int{}
	}
	if len(matrix) == 1 {
		return matrix[0]
	}
	if len(matrix) == 2 {
		outer := make([]int, 0, len(matrix)*4)
		outer = append(outer, matrix[0]...)
		for i := 0; i < len(matrix[1]); i++ {
			outer = append(outer, matrix[1][len(matrix[1])-i-1])
		}
	}
	outer := make([]int, 0, len(matrix)*4)
	outer = append(outer, matrix[0]...)
	for i := 1; i < len(matrix); i++ {
		outer = append(outer, matrix[i][len(matrix[0])-1])
	}
	for i := len(matrix[0]) - 2; i >= 0; i-- {
		outer = append(outer, matrix[len(matrix)-1][i])
	}
	for i := len(matrix) - 2; i > 0 && len(matrix[0]) > 1; i-- {
		outer = append(outer, matrix[i][0])
	}
	return outer
}
